// Copyright (c) 2019 IoTeX
// This is an alpha (internal) release and is not suitable for production. This source code is provided 'as is' and no
// warranties are given as to title or non-infringement, merchantability or fitness for purpose and, to the extent
// permitted by law, all liability for your use of the code is disclaimed. This source code is governed by Apache
// License 2.0 that can be found in the LICENSE file.

package blockchain

import (
	"fmt"
	"math/big"
	"time"

	"github.com/iotexproject/go-pkgs/hash"
	"github.com/iotexproject/iotex-address/address"
	"github.com/pkg/errors"
)

const (
	// TradingID is the ID of Trading
	TradingID = "0000000000000032"
	// TradingBinary is the binary of Trading
	TradingBinary = "6080604052600a6000556000600260006101000a81548160ff02191690831515021790555033600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506153b6806100746000396000f300608060405260043610610180576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301a12fd3146101855780630902f1ac146101c8578063238dafe014610234578063267822471461026357806327a099d8146102ba5780633ccdbb2814610326578063408ee7fe1461039357806346dc4e06146103d65780634cef5a5c146104615780635dada9641461048c5780636aa633b6146104e357806375829def1461051257806377066567146105555780637726bed3146105ac57806377f50f97146105db578063785250da146105f25780637a2b0587146106495780637acc8678146106a45780637c423f54146106e75780638334278d146107535780639870d7fe146107c0578063a0d7bb1b14610803578063ac8a584a14610852578063b2931f1614610895578063c4b91f2f14610927578063c6c3f3f914610a6c578063cfff25bb14610aaf578063e674d91714610ada578063f851a44014610b1d578063fc2a5f4514610b74575b600080fd5b34801561019157600080fd5b506101c6600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bb7565b005b3480156101d457600080fd5b506101dd610f49565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610220578082015181840152602081019050610205565b505050509050019250505060405180910390f35b34801561024057600080fd5b50610249610fd7565b604051808215151515815260200191505060405180910390f35b34801561026f57600080fd5b50610278610fee565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156102c657600080fd5b506102cf611014565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156103125780820151818401526020810190506102f7565b505050509050019250505060405180910390f35b34801561033257600080fd5b50610391600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110a2565b005b34801561039f57600080fd5b506103d4600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112f4565b005b3480156103e257600080fd5b5061044b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291905050506115c0565b6040518082815260200191505060405180910390f35b34801561046d57600080fd5b506104766115e8565b6040518082815260200191505060405180910390f35b34801561049857600080fd5b506104a16115ee565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104ef57600080fd5b506104f8611614565b604051808215151515815260200191505060405180910390f35b34801561051e57600080fd5b50610553600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611627565b005b34801561056157600080fd5b5061056a61185a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156105b857600080fd5b506105d9600480360381019080803515159060200190929190505050611880565b005b3480156105e757600080fd5b506105f0611a83565b005b3480156105fe57600080fd5b50610607611cca565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561065557600080fd5b5061068a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cf0565b604051808215151515815260200191505060405180910390f35b3480156106b057600080fd5b506106e5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d10565b005b3480156106f357600080fd5b506106fc611fda565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561073f578082015181840152602081019050610724565b505050509050019250505060405180910390f35b34801561075f57600080fd5b5061077e60048036038101908080359060200190929190505050612068565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107cc57600080fd5b50610801600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120a6565b005b34801561080f57600080fd5b50610850600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612372565b005b34801561085e57600080fd5b50610893600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612459565b005b3480156108a157600080fd5b5061090a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291905050506127ee565b604051808381526020018281526020019250505060405180910390f35b34801561093357600080fd5b50610a56600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050612a0a565b6040518082815260200191505060405180910390f35b348015610a7857600080fd5b50610aad600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612bf0565b005b348015610abb57600080fd5b50610ac4612dee565b6040518082815260200191505060405180910390f35b348015610ae657600080fd5b50610b1b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612dfb565b005b348015610b2957600080fd5b50610b32612fd7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b8057600080fd5b50610bb5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612ffd565b005b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610c7e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610d3f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f616464726573732069736e277420616c6572746572206e6f770000000000000081525060200191505060405180910390fd5b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600090505b600d80549050811015610f45578173ffffffffffffffffffffffffffffffffffffffff16600d82815481101515610dcf57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610f3a57600d6001600d8054905003815481101515610e2d57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d82815481101515610e6757fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600d805480919060019003610ec491906151bf565b507f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762826000604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a1610f45565b806001019050610d9c565b5050565b60606004805480602002602001604051908101604052809291908181526020018280548015610fcd57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610f83575b5050505050905090565b6000600260009054906101000a900460ff16905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600c80548060200260200160405190810160405280929190818152602001828054801561109857602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161104e575b5050505050905090565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611167576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561120a57600080fd5b505af115801561121e573d6000803e3d6000fd5b505050506040513d602081101561123457600080fd5b8101908080519060200190929190505050151561125057600080fd5b7f72cb8a894ddb372ceec3d2a7648d86f17d5a15caae0e986c53109b8a9a9385e6838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a1505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600b60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561147b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6164647265737320697320616c6572746572206e6f770000000000000000000081525060200191505060405180910390fd5b6032600d8054905010151561148f57600080fd5b7f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762816001604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a16001600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600d8190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60006115ca6151eb565b6115d6868686866131d9565b90508060000151915050949350505050565b60005481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900460ff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156116ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611791576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6e657741646d696e203d3d20616464726573732830290000000000000000000081525060200191505060405180910390fd5b7f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc40600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a180600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611945576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b8015611a6657600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156119a957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515611a0757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515611a6557600080fd5b5b80600260006101000a81548160ff02191690831515021790555050565b3373ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515611b48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f70656e64696e6741646d696e20213d206d73672e73656e64657200000000000081525060200191505060405180910390fd5b7f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016020528060005260406000206000915054906101000a900460ff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611dd5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611e7a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6e657741646d696e203d3d20616464726573732830290000000000000000000081525060200191505060405180910390fd5b7f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4081604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed81600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a180600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600d80548060200260200160405190810160405280929190818152602001828054801561205e57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612014575b5050505050905090565b60048181548110151561207757fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561216b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561222d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f61646472657373206973206f70657261746f72206e6f7700000000000000000081525060200191505060405180910390fd5b6032600c8054905010151561224157600080fd5b7f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b816001604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a16001600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600c8190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612437576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b801561244b5761244682613368565b612455565b612454826134f1565b5b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612520576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156125e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f616464726573732069736e2774206f70657261746f72206e6f7700000000000081525060200191505060405180910390fd5b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600090505b600c805490508110156127ea578173ffffffffffffffffffffffffffffffffffffffff16600c8281548110151561267157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156127df57600c6001600c80549050038154811015156126cf57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c8281548110151561270957fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c8181805490500391508161276991906151bf565b507f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b826000604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a16127ea565b80600101905061263e565b5050565b600080600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156128b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f657870656374656452617465436f6e7472616374206973206e696c000000000081525060200191505060405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b2931f16878787876040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019450505050506040805180830381600087803b1580156129b857600080fd5b505af11580156129cc573d6000803e3d6000fd5b505050506040513d60408110156129e257600080fd5b8101908080519060200190929190805190602001909291905050509150915094509492505050565b6000612a14615255565b60008351141515612a2457600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612a8057600080fd5b8b816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508a816020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508981604001818152505088816060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505087816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050868160a0018181525050858160c00181815250508381610100018181525050848160e0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838161010001818152505082816101200181905250612bdf816136fe565b9150509a9950505050505050505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612cb5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612cf157600080fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ffdd305502f7797ff3390aa08825f7f6aec92c27a94e103bfaf45452b4cf1d4f4600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a150565b6000600480549050905090565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612ec0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612efc57600080fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f698464602a32a4ca1b489513dfa9748e9fa352b64bec7d4c05a6a7df0569fe888133604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a150565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156130c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156130fe57600080fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f4521a4fe69b1ebcfda0c16ab7304eb19347727ef2c21452af7ac16ef282f4b518133604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a150565b6131e16151eb565b61320f85600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168585613c8d565b8260200183608001828152508273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250505061327f85600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16858460800151614149565b8160600181815250506132ba600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685836060015185613c8d565b826040018360a001828152508273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250505061332e600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168583606001518460a00151614149565b8160c0018181525050613357838260c0015161334988614171565b61335288614171565b61426f565b816000018181525050949350505050565b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515156133c157600080fd5b60048190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f7752182b29e356eb432239f464340b4481e1b0bfad97f06aa2ff8cdc74611449816001604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a150565b600080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600090505b6004805490508110156136fa578173ffffffffffffffffffffffffffffffffffffffff1660048281548110151561358257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156136ed5760046001600480549050038154811015156135e057fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660048281548110151561361a57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060048054809190600190036136779190615317565b507f7752182b29e356eb432239f464340b4481e1b0bfad97f06aa2ff8cdc74611449826000604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a16136fa565b808060010191505061354f565b5050565b60006137086151eb565b6000806000600260009054906101000a900460ff1615156137b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001807f6b79626572206e6574776f726b206973456e61626c6564203d3d2066616c736581526020017f2c205f747261646500000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6137d38660200151876040015188606001518960800151614320565b15156137de57600080fd5b6137fb8660200151876060015188604001518961010001516131d9565b935060008460000151111515613879576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f6572723a2072617465526573756c742e72617465203c3d20300000000000000081525060200191505060405180910390fd5b620f4240670de0b6b3a7640000028460000151101515613901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6572723a2072617465526573756c742e72617465203e3d204d41585f5241544581525060200191505060405180910390fd5b8560c001518460000151101515156139a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001807f6572723a2072617465526573756c742e72617465203c205f7472616465496e7081526020017f75742e6d696e436f6e76657273696f6e5261746500000000000000000000000081525060400191505060405180910390fd5b6139c48660200151876060015188604001518960a001518861470d565b8095508194508293505050508560400151811015613aca57856020015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8760000151838960400151036040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613a8d57600080fd5b505af1158015613aa1573d6000803e3d6000fd5b505050506040513d6020811015613ab757600080fd5b8101908080519060200190929190505050505b613b09866020015182600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16308689602001518a6080015160016147ba565b1515613b1457600080fd5b613b57600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683886060015189608001518789604001518a60a0015160016147ba565b1515613b6257600080fd5b7f1c8399ecc5c956b9cb18c820248b10b634cca4af308755e07cd467655e8ec3c7866000015187602001518389608001518a6060015188604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001965050505050505060405180910390a182945050505050919050565b600080613c98615343565b60606000606060008060008660000181815250508a73ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff161415613d2d5760046000815481101515613cf057fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16670de0b6b3a76400009750975061413a565b60006004805490501415613d885760046000815481101515613d4b57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16670de0b6b3a76400009750975061413a565b600480549050604051908082528060200260200182016040528015613dbc5781602001602082028038833980820191505090505b50945060009350600093505b600480549050841015613f9e57600484815481101515613de457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663499dd7798d8d8d438e6040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200195505050505050602060405180830381600087803b158015613ef557600080fd5b505af1158015613f09573d6000803e3d6000fd5b505050506040513d6020811015613f1f57600080fd5b81019080805190602001909291905050508585815181101515613f3e57fe5b906020019060200201818152505085600001518585815181101515613f5f57fe5b906020019060200201511115613f91578484815181101515613f7d57fe5b906020019060200201518660000181815250505b8380600101945050613dc8565b600480549050604051908082528060200260200182016040528015613fd25781602001602082028038833980820191505090505b509250600086602001818152505060008660400181815250506000866000015111156140f257600091506000546127100161271087600001510281151561401557fe5b049050600093505b6004805490508410156140835780858581518110151561403957fe5b9060200190602002015110151561407657838387604001805180919060010181525081518110151561406757fe5b90602001906020020181815250505b838060010194505061401d565b6001866040015111156140ab5785604001516001430340600190048115156140a757fe5b0691505b82828151811015156140b957fe5b906020019060200201518660200181815250508486602001518151811015156140de57fe5b906020019060200201518660000181815250505b6004866020015181548110151561410557fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168660000151975097505b50505050505094509492505050565b60006141678361415887614171565b61416187614171565b8561500a565b9050949350505050565b600080600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811415614265578273ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561422357600080fd5b505af1158015614237573d6000803e3d6000fd5b505050506040513d602081101561424d57600080fd5b81019080805190602001909291905050509150614269565b8091505b50919050565b60006b204fce5e3e25026110000000851115151561428c57600080fd5b6b204fce5e3e2502611000000084111515156142a757600080fd5b82821015156142e6576012838303111515156142c257600080fd5b84838303600a0a02670de0b6b3a764000085028115156142de57fe5b049050614318565b6012828403111515156142f857600080fd5b84828403600a0a670de0b6b3a764000086020281151561431457fe5b0490505b949350505050565b60006b204fce5e3e2502611000000084111515156143cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f6572723a20737263416d6f756e74203e204d41585f515459202c5f76616c696481526020017f617465000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60008414151515614445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f6572723a20737263416d6f756e74203d3d20302c205f76616c6964617465000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614510576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f6572723a206465737441646472657373203d3d20616464726573732830292c2081526020017f5f76616c6964617465000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141515156145b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f6572723a20737263203d3d20646573742c205f76616c6964617465000000000081525060200191505060405180910390fd5b838573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561465057600080fd5b505af1158015614664573d6000803e3d6000fd5b505050506040513d602081101561467a57600080fd5b810190808051906020019092919050505010151515614701576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f7472616e73666572206661696c6564000000000000000000000000000000000081525060200191505060405180910390fd5b60019050949350505050565b6000806000848460c00151111561479d57849050614753600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1688838760a001516150bc565b915061478788600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168487608001516150bc565b925085831115151561479857600080fd5b6147af565b8360c001519050859250836060015191505b955095509592505050565b60008060008873ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff161415614911573073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16141515614908578873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb898c6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156148cb57600080fd5b505af11580156148df573d6000803e3d6000fd5b505050506040513d60208110156148f557600080fd5b8101908080519060200190929190505050505b60019250614ffc565b8a73ffffffffffffffffffffffffffffffffffffffff1663095ea7b3878c6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156149b457600080fd5b505af11580156149c8573d6000803e3d6000fd5b505050506040513d60208110156149de57600080fd5b8101908080519060200190929190505050508873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015614a8b57600080fd5b505af1158015614a9f573d6000803e3d6000fd5b505050506040513d6020811015614ab557600080fd5b810190808051906020019092919050505091508573ffffffffffffffffffffffffffffffffffffffff16636cf698118c8c8c308a8a6040518763ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001821515151581526020019650505050505050602060405180830381600087803b158015614be757600080fd5b505af1158015614bfb573d6000803e3d6000fd5b505050506040513d6020811015614c1157600080fd5b81019080805190602001909291905050501515614c96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f7472616465206661696c6564000000000000000000000000000000000000000081525060200191505060405180910390fd5b8873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015614d3157600080fd5b505af1158015614d45573d6000803e3d6000fd5b505050506040513d6020811015614d5b57600080fd5b81019080805190602001909291905050509050614d8182826150e490919063ffffffff16565b8711151515614df8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f7472616465207472616e73666572206661696c6564000000000000000000000081525060200191505060405180910390fd5b8a73ffffffffffffffffffffffffffffffffffffffff1663095ea7b38760006040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015614e9c57600080fd5b505af1158015614eb0573d6000803e3d6000fd5b505050506040513d6020811015614ec657600080fd5b8101908080519060200190929190505050503073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16141515614ff7578873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb89896040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015614fb057600080fd5b505af1158015614fc4573d6000803e3d6000fd5b505050506040513d6020811015614fda57600080fd5b81019080805190602001909291905050501515614ff657600080fd5b5b600192505b505098975050505050505050565b60006b204fce5e3e25026110000000851115151561502757600080fd5b620f4240670de0b6b3a764000002821115151561504357600080fd5b83831015156150825760128484031115151561505e57600080fd5b670de0b6b3a7640000848403600a0a8387020281151561507a57fe5b0490506150b4565b60128385031115151561509457600080fd5b828403600a0a670de0b6b3a7640000028286028115156150b057fe5b0490505b949350505050565b60006150da836150cb87614171565b6150d487614171565b85615105565b9050949350505050565b6000808383111515156150f657600080fd5b82840390508091505092915050565b60008060006b204fce5e3e25026110000000871115151561512557600080fd5b620f4240670de0b6b3a764000002841115151561514157600080fd5b84861015156151785760128587031115151561515c57600080fd5b848603600a0a87670de0b6b3a7640000020291508390506151a2565b60128686031115151561518a57600080fd5b86670de0b6b3a7640000029150858503600a0a840290505b806001828401038115156151b257fe5b0492505050949350505050565b8154818355818111156151e6578183600052602060002091820191016151e59190615365565b5b505050565b60e06040519081016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081525090565b61014060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b81548183558181111561533e5781836000526020600020918201910161533d9190615365565b5b505050565b6060604051908101604052806000815260200160008152602001600081525090565b61538791905b8082111561538357600081600090555060010161536b565b5090565b905600a165627a7a72305820d024ac8a43203fe746e6e90ad38cead3ba649c3bfbacdece6dbe827563d0e0060029"
	// TradingProxyID is the ID of Trading proxy
	TradingProxyID = "0000000000000033"
	// TradingProxyBinary is the binary of Trading proxy
	TradingProxyBinary = "6080604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506132dc806100536000396000f300608060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301a12fd314610117578063119172d61461015a578063238dafe0146101b157806326782247146101e057806327a099d81461023757806329589f61146102a3578063408ee7fe146103be5780634f61ff8b1461040157806371616bb8146104585780637409e2eb1461049b57806375829def1461052657806377f50f97146105695780637acc8678146105805780637c423f54146105c35780639870d7fe1461062f578063abd188a814610672578063ac8a584a146106b5578063cb3c28c7146106f8578063d4fac45d146107cd578063f851a44014610844575b600080fd5b34801561012357600080fd5b50610158600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061089b565b005b34801561016657600080fd5b5061016f610c2c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101bd57600080fd5b506101c6610c52565b604051808215151515815260200191505060405180910390f35b3480156101ec57600080fd5b506101f5610d1a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561024357600080fd5b5061024c610d40565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561028f578082015181840152602081019050610274565b505050509050019250505060405180910390f35b3480156102af57600080fd5b506103a8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050610dce565b6040518082815260200191505060405180910390f35b3480156103ca57600080fd5b506103ff600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114d8565b005b34801561040d57600080fd5b506104166117a3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561046457600080fd5b50610499600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506117c9565b005b3480156104a757600080fd5b50610510600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506119c6565b6040518082815260200191505060405180910390f35b34801561053257600080fd5b50610567600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119f2565b005b34801561057557600080fd5b5061057e611c24565b005b34801561058c57600080fd5b506105c1600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e69565b005b3480156105cf57600080fd5b506105d8612130565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561061b578082015181840152602081019050610600565b505050509050019250505060405180910390f35b34801561063b57600080fd5b50610670600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121be565b005b34801561067e57600080fd5b506106b3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612489565b005b3480156106c157600080fd5b506106f6600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612686565b005b34801561070457600080fd5b506107b7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a1a565b6040518082815260200191505060405180910390f35b3480156107d957600080fd5b5061082e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a3c565b6040518082815260200191505060405180910390f35b34801561085057600080fd5b50610859612c3e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610961576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610a22576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f616464726573732069736e277420616c6572746572206e6f770000000000000081525060200191505060405180910390fd5b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600090505b600580549050811015610c28578173ffffffffffffffffffffffffffffffffffffffff16600582815481101515610ab257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610c1d576005600160058054905003815481101515610b1057fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600582815481101515610b4a57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506005805480919060019003610ba79190613223565b507f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762826000604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a1610c28565b806001019050610a7f565b5050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663238dafe06040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015610cda57600080fd5b505af1158015610cee573d6000803e3d6000fd5b505050506040513d6020811015610d0457600080fd5b8101908080519060200190929190505050905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606004805480602002602001604051908101604052809291908181526020018280548015610dc457602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610d7a575b5050505050905090565b6000610dd861324f565b6000610de2613269565b610dec8c33612a3c565b8360000181815250508973ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015610e9057600080fd5b505af1158015610ea4573d6000803e3d6000fd5b505050506040513d6020811015610eba57600080fd5b81019080805190602001909291905050508360200181815250508b73ffffffffffffffffffffffffffffffffffffffff166323b872dd33600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168e6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015610fcd57600080fd5b505af1158015610fe1573d6000803e3d6000fd5b505050506040513d6020811015610ff757600080fd5b8101908080519060200190929190505050151561101357600080fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c4b91f2f338e8e8e8e8e8e8e61106233612c63565b8f6040518b63ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156111e05780820151818401526020810190506111c5565b50505050905090810190601f16801561120d5780820380516001836020036101000a031916815260200191505b509b505050505050505050505050602060405180830381600087803b15801561123557600080fd5b505af1158015611249573d6000803e3d6000fd5b505050506040513d602081101561125f57600080fd5b81019080805190602001909291905050509150611287836000015184602001518e8d8d612dc6565b9050806020015182141515611304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f636865636b3a303031000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b87816020015111151515611380576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f636865636b3a303032000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b868160400151101515156113fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f61637475616c52617465203c205f6d696e436f6e76657273696f6e526174650081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f1849bd6a030a1bca28b83437fd3de96f3d27a5d172fa7e9c78e7b61468928a398d8c84600001518560200151604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200194505050505060405180910390a28060200151935050505098975050505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561159c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561165e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6164647265737320697320616c6572746572206e6f770000000000000000000081525060200191505060405180910390fd5b603260058054905010151561167257600080fd5b7f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762816001604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a16001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060058190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561188d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156118c957600080fd5b7f35f15e420366a488d2824de05b9220722a4b7b663d726de5a84e2417c9da946181600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a180600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600060606119e7868686336b204fce5e3e2502611000000088600088610dce565b915050949350505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ab6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611b5b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6e657741646d696e203d3d20616464726573732830290000000000000000000081525060200191505060405180910390fd5b7f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc40600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a180600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b3373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515611ce9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f70656e64696e6741646d696e20213d206d73672e73656e64657200000000000081525060200191505060405180910390fd5b7f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611f2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611fd2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6e657741646d696e203d3d20616464726573732830290000000000000000000081525060200191505060405180910390fd5b7f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4081604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed816000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060058054806020026020016040519081016040528092919081815260200182805480156121b457602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161216a575b5050505050905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612282576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515612344576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f61646472657373206973206f70657261746f72206e6f7700000000000000000081525060200191505060405180910390fd5b603260048054905010151561235857600080fd5b7f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b816001604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a16001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060048190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561254d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561258957600080fd5b7f8936e1f096bf0a8c9df862b3d1d5b82774cad78116200175f00b5b7ba3010b0281600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a180600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561274c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561280d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f616464726573732069736e2774206f70657261746f72206e6f7700000000000081525060200191505060405180910390fd5b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600090505b600480549050811015612a16578173ffffffffffffffffffffffffffffffffffffffff1660048281548110151561289d57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612a0b5760046001600480549050038154811015156128fb57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660048281548110151561293557fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060016004818180549050039150816129959190613223565b507f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b826000604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a1612a16565b80600101905061286a565b5050565b60006060612a2e8989898989898988610dce565b915050979650505050505050565b60008060008473ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015612adc57600080fd5b505af1158015612af0573d6000803e3d6000fd5b505050506040513d6020811015612b0657600080fd5b810190808051906020019092919050505091508473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e85306040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b158015612be857600080fd5b505af1158015612bfc573d6000803e3d6000fd5b505050506040513d6020811015612c1257600080fd5b81019080805190602001909291905050509050808210612c325780612c34565b815b9250505092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009050600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612dbd57600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663887712c7846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015612d7f57600080fd5b505af1158015612d93573d6000803e3d6000fd5b505050506040513d6020811015612da957600080fd5b810190808051906020019092919050505090505b80915050919050565b612dce613269565b600080612ddb8633612a3c565b91508473ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015612e7857600080fd5b505af1158015612e8c573d6000803e3d6000fd5b505050506040513d6020811015612ea257600080fd5b810190808051906020019092919050505090508681111515612f2c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f636865636b3a303033000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8188111515612fa3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f636865636b3a303034000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b868103836020018181525050818803836000018181525050612fdf83600001518460200151612fd189612ff3565b612fda89612ff3565b61308d565b836040018181525050505095945050505050565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415613046576130458261313e565b5b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006b204fce5e3e2502611000000085111515156130aa57600080fd5b6b204fce5e3e2502611000000084111515156130c557600080fd5b8282101515613104576012838303111515156130e057600080fd5b84838303600a0a02670de0b6b3a764000085028115156130fc57fe5b049050613136565b60128284031115151561311657600080fd5b84828403600a0a670de0b6b3a764000086020281151561313257fe5b0490505b949350505050565b8073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156131a257600080fd5b505af11580156131b6573d6000803e3d6000fd5b505050506040513d60208110156131cc57600080fd5b8101908080519060200190929190505050600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b81548183558181111561324a57818360005260206000209182019101613249919061328b565b5b505050565b604080519081016040528060008152602001600081525090565b6060604051908101604052806000815260200160008152602001600081525090565b6132ad91905b808211156132a9576000816000905550600101613291565b5090565b905600a165627a7a723058207d6fdd1d7423cfeff12dac97510b708db240e511355b10e5ce7581e076830c0f0029"
	// ReserveID is the ID of Reserve
	ReserveID = "0000000000000034"
	// ReserveBinary is the binary of Reserve
	ReserveBinary = "608060405260008060006101000a81548160ff02191690831515021790555033600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555030600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550614213806100f06000396000f300608060405260043610610189576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806299d3861461018e578062af0907146101bd57806301a12fd3146102005780630d9e58d9146102435780631bc7bfec1461029a57806326782247146102fd57806327a099d8146103545780633ccdbb28146103c0578063408ee7fe1461042d578063499dd77914610470578063546dc71c1461050557806354a325a6146105745780636940030f146105b75780636cf69811146105e657806375829def146106a157806377066567146106e457806377f50f971461073b5780637acc8678146107525780637c423f541461079557806385d75025146108015780639870d7fe14610884578063a80cbac6146108c7578063ac8a584a1461094a578063b78b842d1461098d578063d5847d33146109e4578063d621e81314610a3b578063d7b7024d14610a6a578063e674d91714610ab3578063eef9b11314610af6578063f851a44014610b39578063f8b2cb4f14610b90575b600080fd5b34801561019a57600080fd5b506101a3610be7565b604051808215151515815260200191505060405180910390f35b3480156101c957600080fd5b506101fe600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610fac565b005b34801561020c57600080fd5b50610241600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110b5565b005b34801561024f57600080fd5b50610258611447565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156102a657600080fd5b506102fb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061146d565b005b34801561030957600080fd5b50610312611687565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561036057600080fd5b506103696116ad565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156103ac578082015181840152602081019050610391565b505050509050019250505060405180910390f35b3480156103cc57600080fd5b5061042b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061173b565b005b34801561043957600080fd5b5061046e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061198d565b005b34801561047c57600080fd5b506104ef600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190505050611c59565b6040518082815260200191505060405180910390f35b34801561051157600080fd5b50610572600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611ea3565b005b34801561058057600080fd5b506105b5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612310565b005b3480156105c357600080fd5b506105cc612419565b604051808215151515815260200191505060405180910390f35b3480156105f257600080fd5b50610687600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803515159060200190929190505050612539565b604051808215151515815260200191505060405180910390f35b3480156106ad57600080fd5b506106e2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506126d0565b005b3480156106f057600080fd5b506106f9612903565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561074757600080fd5b50610750612929565b005b34801561075e57600080fd5b50610793600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b70565b005b3480156107a157600080fd5b506107aa612e3a565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156107ed5780820151818401526020810190506107d2565b505050509050019250505060405180910390f35b34801561080d57600080fd5b50610842600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612ec8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561089057600080fd5b506108c5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f91565b005b3480156108d357600080fd5b50610908600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061325d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561095657600080fd5b5061098b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613290565b005b34801561099957600080fd5b506109a2613625565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156109f057600080fd5b506109f961364b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a4757600080fd5b50610a50613671565b604051808215151515815260200191505060405180910390f35b348015610a7657600080fd5b50610a996004803603810190808035600019169060200190929190505050613683565b604051808215151515815260200191505060405180910390f35b348015610abf57600080fd5b50610af4600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506136a3565b005b348015610b0257600080fd5b50610b37600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506137ac565b005b348015610b4557600080fd5b50610b4e6138f1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b9c57600080fd5b50610bd1600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613917565b6040518082815260200191505060405180910390f35b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610cae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515610d9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f636f6e76657273696f6e5261746573436f6e747261637420697320756e73657481526020017f207374617465000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515610e88576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f62656e63686d61726b537461626c65546f6b656e20697320756e73657420737481526020017f617465000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515610f4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f6b796265724e6574776f726b20697320756e736574207374617465000000000081525060200191505060405180910390fd5b60016000806101000a81548160ff0219169083151502179055507f7d7f00509dd73ac4449f698ae75ccc797895eff5fa9d446d3df387598a26e7356001604051808215151515815260200191505060405180910390a16001905090565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611071576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561117c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561123d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f616464726573732069736e277420616c6572746572206e6f770000000000000081525060200191505060405180910390fd5b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600090505b600b80549050811015611443578173ffffffffffffffffffffffffffffffffffffffff16600b828154811015156112cd57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561143857600b6001600b805490500381548110151561132b57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b8281548110151561136557fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b8054809190600190036113c29190614196565b507f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762826000604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a1611443565b80600101905061129a565b5050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611532576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561156e57600080fd5b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f81995c7b922889ac0a81e41866106d4046268ea3a9abaae9f9e080a6ce36ee7d8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a15050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600a80548060200260200160405190810160405280929190818152602001828054801561173157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116116e7575b5050505050905090565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156118a357600080fd5b505af11580156118b7573d6000803e3d6000fd5b505050506040513d60208110156118cd57600080fd5b810190808051906020019092919050505015156118e957600080fd5b7f72cb8a894ddb372ceec3d2a7648d86f17d5a15caae0e986c53109b8a9a9385e6838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a1505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a52576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515611b14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6164647265737320697320616c6572746572206e6f770000000000000000000081525060200191505060405180910390fd5b6032600b80549050101515611b2857600080fd5b7f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762816001604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a16001600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600b8190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008060008060008060009054906101000a900460ff161515611c7f5760009450611e96565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff161415611ce15760009350889250611d4d565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161415611d435760019350899250611d4c565b60009450611e96565b5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663281379688489878c8b6040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018415151515815260200183815260200182815260200195505050505050602060405180830381600087803b158015611e2e57600080fd5b505af1158015611e42573d6000803e3d6000fd5b505050506040513d6020811015611e5857600080fd5b81019080805190602001909291905050509150611e778a8a8a85613b25565b905080611e838a613917565b1015611e925760009450611e96565b8194505b5050505095945050505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611f68576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b80600360008585604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040516020818303038152906040526040518082805190602001908083835b602083101515612040578051825260208201915060208101905060208303925061201b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055507fd5fd5351efae1f4bb760079da9f0ff9589e2c3e216337ca9d39cdff573b245c4838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182151515158152602001935050505060405180910390a161214683613b58565b600073ffffffffffffffffffffffffffffffffffffffff1661216784612ec8565b73ffffffffffffffffffffffffffffffffffffffff16141561230b5730600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff1663095ea7b3307f80000000000000000000000000000000000000000000000000000000000000006040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156122c457600080fd5b505af11580156122d8573d6000803e3d6000fd5b505050506040513d60208110156122ee57600080fd5b8101908080519060200190929190505050151561230a57600080fd5b5b505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156123d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b80600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156124dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f6d73672e73656e6465722069736e277420616c6572746572000000000000000081525060200191505060405180910390fd5b60008060006101000a81548160ff0219169083151502179055507f7d7f00509dd73ac4449f698ae75ccc797895eff5fa9d446d3df387598a26e7356000604051808215151515815260200191505060405180910390a16001905090565b60008060009054906101000a900460ff1615156125be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f74726164652064697361626c656400000000000000000000000000000000000081525060200191505060405180910390fd5b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156126a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f6d73672e73656e64657220213d2061646472657373286b796265724e6574776f81526020017f726b29000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6126b7878787878787613c3d565b15156126c257600080fd5b600190509695505050505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612795576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561283a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6e657741646d696e203d3d20616464726573732830290000000000000000000081525060200191505060405180910390fd5b7f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc40600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a180600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156129ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f70656e64696e6741646d696e20213d206d73672e73656e64657200000000000081525060200191505060405180910390fd5b7f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612c35576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612cda576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6e657741646d696e203d3d20616464726573732830290000000000000000000081525060200191505060405180910390fd5b7f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4081604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed81600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a180600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600b805480602002602001604051908101604052809291908181526020018280548015612ebe57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612e74575b5050505050905090565b600080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612f8857600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b80915050919050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613056576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515613118576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f61646472657373206973206f70657261746f72206e6f7700000000000000000081525060200191505060405180910390fd5b6032600a8054905010151561312c57600080fd5b7f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b816001604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a16001600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600a8190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613357576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515613418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f616464726573732069736e2774206f70657261746f72206e6f7700000000000081525060200191505060405180910390fd5b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600090505b600a80549050811015613621578173ffffffffffffffffffffffffffffffffffffffff16600a828154811015156134a857fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561361657600a6001600a805490500381548110151561350657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a8281548110151561354057fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600a818180549050039150816135a09190614196565b507f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b826000604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a1613621565b806001019050613475565b5050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900460ff1681565b60036020528060005260406000206000915054906101000a900460ff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613768576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613871576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156138ad57600080fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008061392685612ec8565b92508473ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156139c357600080fd5b505af11580156139d7573d6000803e3d6000fd5b505050506040513d60208110156139ed57600080fd5b810190808051906020019092919050505091508473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84306040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b158015613acf57600080fd5b505af1158015613ae3573d6000803e3d6000fd5b505050506040513d6020811015613af957600080fd5b81019080805190602001909291905050509050808210613b195780613b1b565b815b9350505050919050565b6000806000613b3386613fbe565b9150613b3e87613fbe565b9050613b4c858284876140bc565b92505050949350505050565b8073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015613bbc57600080fd5b505af1158015613bd0573d6000803e3d6000fd5b505050506040513d6020811015613be657600080fd5b8101908080519060200190929190505050600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b6000808215613c5657600084111515613c5557600080fd5b5b613c628887898761416e565b9050600081111515613c7357600080fd5b8773ffffffffffffffffffffffffffffffffffffffff166323b872dd33613c998b612ec8565b8a6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015613d5257600080fd5b505af1158015613d66573d6000803e3d6000fd5b505050506040513d6020811015613d7c57600080fd5b81019080805190602001909291905050501515613d9857600080fd5b8573ffffffffffffffffffffffffffffffffffffffff166323b872dd613dbd88612ec8565b87846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015613e7757600080fd5b505af1158015613e8b573d6000803e3d6000fd5b505050506040513d6020811015613ea157600080fd5b81019080805190602001909291905050501515613ebd57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff167fea9415385bae08fe9f6dc457b02577166790cde83bb18cc340aac6cb81b824de898989858a604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a260019150509695505050505050565b600080600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008114156140b2578273ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561407057600080fd5b505af1158015614084573d6000803e3d6000fd5b505050506040513d602081101561409a57600080fd5b810190808051906020019092919050505091506140b6565b8091505b50919050565b60006b204fce5e3e2502611000000085111515156140d957600080fd5b620f4240670de0b6b3a76400000282111515156140f557600080fd5b83831015156141345760128484031115151561411057600080fd5b670de0b6b3a7640000848403600a0a8387020281151561412c57fe5b049050614166565b60128385031115151561414657600080fd5b828403600a0a670de0b6b3a76400000282860281151561416257fe5b0490505b949350505050565b600061418c8361417d87613fbe565b61418687613fbe565b856140bc565b9050949350505050565b8154818355818111156141bd578183600052602060002091820191016141bc91906141c2565b5b505050565b6141e491905b808211156141e05760008160009055506001016141c8565b5090565b905600a165627a7a72305820752dade2cc85eecee5f1712aa0bc1b17851f32c0a38a0920a09cbf08b8776a3c0029"
	// CreditRatingID is the ID of CreditRating
	CreditRatingID = "0000000000000035"
	// CreditRatingBinary is the binary of CreditRating
	CreditRatingBinary = "6080604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611e82806100536000396000f3006080604052600436106100db576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301a12fd3146100e05780630a5cac08146101235780631f45051c1461017a57806326782247146101a757806327a099d8146101fe578063408ee7fe1461026a57806375829def146102ad57806377f50f97146102f05780637acc8678146103075780637c423f541461034a578063887712c7146103b65780638b687a741461040d5780639870d7fe1461045a578063ac8a584a1461049d578063f851a440146104e0575b600080fd5b3480156100ec57600080fd5b50610121600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610537565b005b34801561012f57600080fd5b50610164600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506108c8565b6040518082815260200191505060405180910390f35b34801561018657600080fd5b506101a5600480360381019080803590602001909291905050506108e0565b005b3480156101b357600080fd5b506101bc6109eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561020a57600080fd5b50610213610a11565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561025657808201518184015260208101905061023b565b505050509050019250505060405180910390f35b34801561027657600080fd5b506102ab600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a9f565b005b3480156102b957600080fd5b506102ee600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d6a565b005b3480156102fc57600080fd5b50610305610f9c565b005b34801561031357600080fd5b50610348600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506111e1565b005b34801561035657600080fd5b5061035f6114a8565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156103a2578082015181840152602081019050610387565b505050509050019250505060405180910390f35b3480156103c257600080fd5b506103f7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611536565b6040518082815260200191505060405180910390f35b34801561041957600080fd5b50610458600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115d0565b005b34801561046657600080fd5b5061049b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611781565b005b3480156104a957600080fd5b506104de600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a4c565b005b3480156104ec57600080fd5b506104f5611de0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156105fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156106be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f616464726573732069736e277420616c6572746572206e6f770000000000000081525060200191505060405180910390fd5b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600090505b6005805490508110156108c4578173ffffffffffffffffffffffffffffffffffffffff1660058281548110151561074e57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156108b95760056001600580549050038154811015156107ac57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166005828154811015156107e657fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060058054809190600190036108439190611e05565b507f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762826000604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a16108c4565b80600101905061071b565b5050565b60066020528060005260406000206000915090505481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b80600660008073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606004805480602002602001604051908101604052809291908181526020018280548015610a9557602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610a4b575b5050505050905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b63576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515610c25576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6164647265737320697320616c6572746572206e6f770000000000000000000081525060200191505060405180910390fd5b6032600580549050101515610c3957600080fd5b7f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762816001604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a16001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060058190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e2e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610ed3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6e657741646d696e203d3d20616464726573732830290000000000000000000081525060200191505060405180910390fd5b7f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc40600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a180600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b3373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515611061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f70656e64696e6741646d696e20213d206d73672e73656e64657200000000000081525060200191505060405180910390fd5b7f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561134a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6e657741646d696e203d3d20616464726573732830290000000000000000000081525060200191505060405180910390fd5b7f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4081604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed816000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600580548060200260200160405190810160405280929190818152602001828054801561152c57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116114e2575b5050505050905090565b600080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008114156115c757600660008073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490505b80915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611694576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611739576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5f61646472203d3d20616464726573732830290000000000000000000000000081525060200191505060405180910390fd5b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611845576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515611907576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f61646472657373206973206f70657261746f72206e6f7700000000000000000081525060200191505060405180910390fd5b603260048054905010151561191b57600080fd5b7f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b816001604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a16001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060048190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b12576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611bd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f616464726573732069736e2774206f70657261746f72206e6f7700000000000081525060200191505060405180910390fd5b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600090505b600480549050811015611ddc578173ffffffffffffffffffffffffffffffffffffffff16600482815481101515611c6357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611dd1576004600160048054905003815481101515611cc157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600482815481101515611cfb57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600481818054905003915081611d5b9190611e05565b507f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b826000604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a1611ddc565b806001019050611c30565b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b815481835581811115611e2c57818360005260206000209182019101611e2b9190611e31565b5b505050565b611e5391905b80821115611e4f576000816000905550600101611e37565b5090565b905600a165627a7a723058207d0a4917b69c62b57d1bc00af761fb8d5f0200babd75bfc8f860653cbcf94a7c0029"
	// ExpectedRateID is the ID of ExpectedRate
	ExpectedRateID = "0000000000000036"
	// ExpectedRateBinary is the binary of ExpectedRate
	ExpectedRateBinary = "6080604052600260075534801561001557600080fd5b506040516040806124f48339810180604052810190808051906020019092919080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156100be57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156100fa57600080fd5b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506123688061018c6000396000f3006080604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301a12fd3146100eb578063267822471461012e57806327a099d8146101855780633ccdbb28146101f1578063408ee7fe1461025e57806375829def146102a15780637658c574146102e457806377f50f97146103115780637acc8678146103285780637c423f541461036b5780639870d7fe146103d7578063a7de9c631461041a578063ac8a584a14610445578063b2931f1614610488578063b78b842d1461051a578063f851a44014610571575b600080fd5b3480156100f757600080fd5b5061012c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506105c8565b005b34801561013a57600080fd5b50610143610959565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561019157600080fd5b5061019a61097f565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156101dd5780820151818401526020810190506101c2565b505050509050019250505060405180910390f35b3480156101fd57600080fd5b5061025c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a0d565b005b34801561026a57600080fd5b5061029f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c5e565b005b3480156102ad57600080fd5b506102e2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f29565b005b3480156102f057600080fd5b5061030f6004803603810190808035906020019092919050505061115b565b005b34801561031d57600080fd5b506103266112ab565b005b34801561033457600080fd5b50610369600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114f0565b005b34801561037757600080fd5b506103806117b7565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156103c35780820151818401526020810190506103a8565b505050509050019250505060405180910390f35b3480156103e357600080fd5b50610418600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611845565b005b34801561042657600080fd5b5061042f611b10565b6040518082815260200191505060405180910390f35b34801561045157600080fd5b50610486600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b16565b005b34801561049457600080fd5b506104fd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050611eaa565b604051808381526020018281526020019250505060405180910390f35b34801561052657600080fd5b5061052f6122a0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561057d57600080fd5b506105866122c6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561068e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561074f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f616464726573732069736e277420616c6572746572206e6f770000000000000081525060200191505060405180910390fd5b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600090505b600580549050811015610955578173ffffffffffffffffffffffffffffffffffffffff166005828154811015156107df57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561094a57600560016005805490500381548110151561083d57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660058281548110151561087757fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060058054809190600190036108d491906122eb565b507f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762826000604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a1610955565b8060010190506107ac565b5050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606004805480602002602001604051908101604052809291908181526020018280548015610a0357602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116109b9575b5050505050905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ad1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610b7457600080fd5b505af1158015610b88573d6000803e3d6000fd5b505050506040513d6020811015610b9e57600080fd5b81019080805190602001909291905050501515610bba57600080fd5b7f72cb8a894ddb372ceec3d2a7648d86f17d5a15caae0e986c53109b8a9a9385e6838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a1505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610d22576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515610de4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6164647265737320697320616c6572746572206e6f770000000000000000000081525060200191505060405180910390fd5b6032600580549050101515610df857600080fd5b7f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762816001604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a16001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060058190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610fed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611092576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6e657741646d696e203d3d20616464726573732830290000000000000000000081525060200191505060405180910390fd5b7f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc40600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a180600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561121c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f6d73672e73656e6465722069736e2774206f70657261746f720000000000000081525060200191505060405180910390fd5b6064811115151561122c57600080fd5b7fd0f6fc40d497232b5aab1b7a34ea00ea45886e52d2fed39ad62af798a870fae38160075433604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a18060078190555050565b3373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515611370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f70656e64696e6741646d696e20213d206d73672e73656e64657200000000000081525060200191505060405180910390fd5b7f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611659576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6e657741646d696e203d3d20616464726573732830290000000000000000000081525060200191505060405180910390fd5b7f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4081604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed816000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600580548060200260200160405190810160405280929190818152602001828054801561183b57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116117f1575b5050505050905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611909576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515156119cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f61646472657373206973206f70657261746f72206e6f7700000000000000000081525060200191505060405180910390fd5b60326004805490501015156119df57600080fd5b7f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b816001604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a16001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060048190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60075481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611bdc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611c9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f616464726573732069736e2774206f70657261746f72206e6f7700000000000081525060200191505060405180910390fd5b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600090505b600480549050811015611ea6578173ffffffffffffffffffffffffffffffffffffffff16600482815481101515611d2d57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611e9b576004600160048054905003815481101515611d8b57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600482815481101515611dc557fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600481818054905003915081611e2591906122eb565b507f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b826000604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a1611ea6565b806001019050611cfa565b5050565b600080600060075414151515611ebf57600080fd5b6b204fce5e3e250261100000008411151515611eda57600080fd5b6b204fce5e3e25026110000000600754850211151515611ef957600080fd5b6000841415611f0757600193505b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166346dc4e06878787876040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001945050505050602060405180830381600087803b15801561200857600080fd5b505af115801561201c573d6000803e3d6000fd5b505050506040513d602081101561203257600080fd5b81019080805190602001909291905050509150600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166346dc4e0687876007548802876040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001945050505050602060405180830381600087803b15801561214a57600080fd5b505af115801561215e573d6000803e3d6000fd5b505050506040513d602081101561217457600080fd5b81019080805190602001909291905050509050620f4240670de0b6b3a764000002821115151561220c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f6578706563746564526174652063616e742774203e204d41585f52415445000081525060200191505060405180910390fd5b620f4240670de0b6b3a7640000028111151515612291576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f736c697070616765526174652063616e742774203e204d41585f52415445000081525060200191505060405180910390fd5b81819150915094509492505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b815481835581811115612312578183600052602060002091820191016123119190612317565b5b505050565b61233991905b8082111561233557600081600090555060010161231d565b5090565b905600a165627a7a72305820c7029dfa12b0f8438db36c4b3a9726f58ee7be0c1367d8c416777d49b61e63e10029"
	// ConversionRateID is the ID of ConversionRate
	ConversionRateID = "0000000000000037"
	// ConversionRateBinary is the binary of ConversionRate
	ConversionRateBinary = "608060405260cf6000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613e96806100956000396000f300608060405260043610610175576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301a12fd31461017a57806303d630ab146101bd5780630556d16a1461022a57806310e9ed811461028557806321b13c40146102e357806322e39ed31461030e57806326782247146103fa57806327a099d81461045157806328137968146104bd5780633ccdbb281461053e578063408ee7fe146105ab57806344b4c8fd146105ee57806360e5d255146106fa578063643278701461075157806375829def146107a857806377f50f97146107eb5780637acc8678146108025780637c423f54146108455780639870d7fe146108b15780639b6d6dfa146108f4578063a42c69a914610937578063ac8a584a14610962578063b6effa16146109a5578063eb0b304a14610a91578063ebc9b79a14610ac0578063ecb5cc7114610b17578063f0bc1c2b14610b4e578063f6252c7114610b91578063f851a44014610be0575b600080fd5b34801561018657600080fd5b506101bb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c37565b005b3480156101c957600080fd5b50610214600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803515159060200190929190505050610fc9565b6040518082815260200191505060405180910390f35b34801561023657600080fd5b5061026b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610fdf565b604051808215151515815260200191505060405180910390f35b34801561029157600080fd5b506102c6600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506111a2565b604051808381526020018281526020019250505060405180910390f35b3480156102ef57600080fd5b506102f8611234565b6040518082815260200191505060405180910390f35b34801561031a57600080fd5b506103f860048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929050505061123b565b005b34801561040657600080fd5b5061040f6113e6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561045d57600080fd5b5061046661140c565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156104a957808201518184015260208101905061048e565b505050509050019250505060405180910390f35b3480156104c957600080fd5b50610528600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803515159060200190929190803590602001909291908035906020019092919050505061149a565b6040518082815260200191505060405180910390f35b34801561054a57600080fd5b506105a9600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611507565b005b3480156105b757600080fd5b506105ec600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611759565b005b3480156105fa57600080fd5b506106f8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290505050611a25565b005b34801561070657600080fd5b5061070f611bc3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561075d57600080fd5b50610766611be9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107b457600080fd5b506107e9600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c0f565b005b3480156107f757600080fd5b50610800611e42565b005b34801561080e57600080fd5b50610843600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612089565b005b34801561085157600080fd5b5061085a612353565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561089d578082015181840152602081019050610882565b505050509050019250505060405180910390f35b3480156108bd57600080fd5b506108f2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506123e1565b005b34801561090057600080fd5b50610935600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506126ad565b005b34801561094357600080fd5b5061094c6127b6565b6040518082815260200191505060405180910390f35b34801561096e57600080fd5b506109a3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127bc565b005b3480156109b157600080fd5b50610a8f600480360381019080803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290505050612b51565b005b348015610a9d57600080fd5b50610abe600480360381019080803515159060200190929190505050612c48565b005b348015610acc57600080fd5b50610ad5612d8b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b2357600080fd5b50610b4c6004803603810190808035906020019092919080359060200190929190505050612db0565b005b348015610b5a57600080fd5b50610b8f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f49565b005b348015610b9d57600080fd5b50610bde600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050613052565b005b348015610bec57600080fd5b50610bf56131e0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610cfe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610dbf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f616464726573732069736e277420616c6572746572206e6f770000000000000081525060200191505060405180910390fd5b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600090505b600980549050811015610fc5578173ffffffffffffffffffffffffffffffffffffffff16600982815481101515610e4f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610fba576009600160098054905003815481101515610ead57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600982815481101515610ee757fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506009805480919060019003610f449190613e19565b507f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762826000604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a1610fc5565b806001019050610e1c565b5050565b6000610fd6848484613206565b90509392505050565b6000806000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff16915081806110905750600073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b1561109d5781925061119b565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663fc91a897856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561115d57600080fd5b505af1158015611171573d6000803e3d6000fd5b505050506040513d602081101561118757600080fd5b810190808051906020019092919050505092505b5050919050565b600080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015491509150915091565b6201518081565b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156112fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f6d73672e73656e6465722069736e2774206f70657261746f720000000000000081525060200191505060405180910390fd5b600090505b83518110156113d557600073ffffffffffffffffffffffffffffffffffffffff16848281518110151561133257fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16141515156113c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f73657442617365526174653a206164647265737328302900000000000000000081525060200191505060405180910390fd5b8080600101915050611303565b6113e08484846132cc565b50505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600880548060200260200160405190810160405280929190818152602001828054801561149057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611446575b5050505050905090565b6000806114a687610fdf565b15156114b557600091506114fd565b60008614806114c45750600084145b156114d257600091506114fd565b6114dd87868561357d565b90506114fa81670de0b6b3a76400006137dc90919063ffffffff16565b91505b5095945050505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561166f57600080fd5b505af1158015611683573d6000803e3d6000fd5b505050506040513d602081101561169957600080fd5b810190808051906020019092919050505015156116b557600080fd5b7f72cb8a894ddb372ceec3d2a7648d86f17d5a15caae0e986c53109b8a9a9385e6838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a1505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561181e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515156118e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6164647265737320697320616c6572746572206e6f770000000000000000000081525060200191505060405180910390fd5b60326009805490501015156118f457600080fd5b7f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762816001604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a16001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060098190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611ae6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f6d73672e73656e6465722069736e2774206f70657261746f720000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614151515611bb1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f736574437265646974526174696e67466163746f723a2061646472657373283081526020017f290000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b611bbd848484846137fd565b50505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611cd4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611d79576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6e657741646d696e203d3d20616464726573732830290000000000000000000081525060200191505060405180910390fd5b7f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc40600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a180600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b3373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515611f07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f70656e64696e6741646d696e20213d206d73672e73656e64657200000000000081525060200191505060405180910390fd5b7f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561214e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156121f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6e657741646d696e203d3d20616464726573732830290000000000000000000081525060200191505060405180910390fd5b7f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4081604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed81600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a180600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060098054806020026020016040519081016040528092919081815260200182805480156123d757602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161238d575b5050505050905090565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156124a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515612568576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f61646472657373206973206f70657261746f72206e6f7700000000000000000081525060200191505060405180910390fd5b603260088054905010151561257c57600080fd5b7f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b816001604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a16001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060088190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612772576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6103e881565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612883576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515612944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f616464726573732069736e2774206f70657261746f72206e6f7700000000000081525060200191505060405180910390fd5b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600090505b600880549050811015612b4d578173ffffffffffffffffffffffffffffffffffffffff166008828154811015156129d457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612b42576008600160088054905003815481101515612a3257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600882815481101515612a6c57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600881818054905003915081612acc9190613e19565b507f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b826000604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a1612b4d565b8060010190506129a1565b5050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612c16576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b612c436000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff168484846137fd565b505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612d0d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b80600160008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548160ff02191690831515021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612e75576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b81600160008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555080600160008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561300e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613119576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d73672e73656e6465722069736e27742061646d696e0000000000000000000081525060200191505060405180910390fd5b829050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1615151561317857600080fd5b81600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548160ff0219169083151502179055506131db83613a11565b505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080821561326a57600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008581526020019081526020016000205490506132c1565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008581526020019081526020016000205490505b809150509392505050565b60008083518551141515613348576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f62617365427579206c656e677468206572726f7200000000000000000000000081525060200191505060405180910390fd5b825185511415156133c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f6261736553656c6c206c656e677468206572726f72000000000000000000000081525060200191505060405180910390fd5b600091505b84518210156135765784828151811015156133dd57fe5b906020019060200201519050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1615156134ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f7468697320746f6b656e2063616e2774206c697374656400000000000000000081525060200191505060405180910390fd5b83828151811015156134bb57fe5b90602001906020020151600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550828281518110151561351957fe5b90602001906020020151600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002018190555081806001019250506133c6565b5050505050565b600080600080600080600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561364d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f65617053746f72616765206973206e696c00000000000000000000000000000081525060200191505060405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a339d34a8a6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561370a57600080fd5b505af115801561371e573d6000803e3d6000fd5b505050506040513d602081101561373457600080fd5b81019080805190602001909291905050509450429350848410151561375c57600095506137d0565b61376789888a613af6565b925061377c84866137dc90919063ffffffff16565b91506137946201518083613b4690919063ffffffff16565b9050816137ad6201518083613b7090919063ffffffff16565b10156137ba576001810190505b6137cd8184613b7090919063ffffffff16565b95505b50505050509392505050565b6000808383111515156137ee57600080fd5b82840390508091505092915050565b60008251845114151561380f57600080fd5b8151845114151561381f57600080fd5b600090505b8351811015613a0a57600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1615156138f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f7468697320746f6b656e2063616e2774206c697374656400000000000000000081525060200191505060405180910390fd5b82818151811015156138ff57fe5b90602001906020020151600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003016000868481518110151561395b57fe5b90602001906020020151815260200190815260200160002081905550818181518110151561398557fe5b90602001906020020151600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401600086848151811015156139e157fe5b906020019060200201518152602001908152602001600020819055508080600101915050613824565b5050505050565b8073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015613a7557600080fd5b505af1158015613a89573d6000803e3d6000fd5b505050506040513d6020811015613a9f57600080fd5b8101908080519060200190929190505050600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b6000806000613b058685613bae565b9150613b12868686613c77565b9050613b3b6103e8613b2d8385613b7090919063ffffffff16565b613b4690919063ffffffff16565b925050509392505050565b600080600083111515613b5857600080fd5b8284811515613b6357fe5b0490508091505092915050565b6000806000841415613b855760009150613ba7565b8284029050828482811515613b9657fe5b04141515613ba357600080fd5b8091505b5092915050565b600080613bbb8484613d43565b9050600081148015613c3a5750600160008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff165b15613c6d57613c6a6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684613d43565b90505b8091505092915050565b600080613c85858585613de6565b9050600081148015613d045750600160008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff165b15613d3857613d356000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff168585613de6565b90505b809150509392505050565b6000808215613d9657600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050613ddc565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015490505b8091505092915050565b600080613df4858585613206565b90506000811415613e0e57613e0b85600085613206565b90505b809150509392505050565b815481835581811115613e4057818360005260206000209182019101613e3f9190613e45565b5b505050565b613e6791905b80821115613e63576000816000905550600101613e4b565b5090565b905600a165627a7a7230582064d812ccd439ab9b0588d7e84fa795bb2d639ac4dc000348f8f2f04e12eaeb0d0029"
	// StartTradingID is the ID of StartTrading
	StartTradingID = "0000000000000038"
)

type (
	// Trading is an interface for trading platform
	Trading interface {
		Contract
		CreateReserve(string, string) (string, string, error)
		SetInterest(string, []string, []int64, []int64) (string, error)
		SetFactor(string, string, []int64, []int64, []int64) (string, error)
		SetAccountCreditRating(string, int64) (string, error)
		GetAccountCreditRating(string) (string, error)
		QuoteRate(string, string, int64, int64) (string, error)
		Trade(string, string, string, string, int64, int64) (string, error)

		SetTrading(string) Trading
		SetTradingProxy(string) Trading
		SetCreditRating(string) Trading
		SetExpectedRate(string) Trading
		SetEapStorage(string) Trading
		SetFpManage(string) Trading
		SetStableToken(string) Trading
	}

	trading struct {
		Contract
		kyber          string // address of trading contract
		kyberProxy     string // address of trading contract proxy
		reserve        string // address of reserve contract
		creditRating   string // address of credit rating contract
		expectedRate   string // address of expected rate contract
		conversionRate string // address of daily conversion rate contract
		eapStorage     string // address of eap storage in fp token contract
		fpManage       string // address of management contract in fp token contract
		stbToken       string // address of stable token contract
	}
)

// NewTrading creates a new trading
func NewTrading(exp string) Trading {
	return &trading{Contract: NewContract(exp)}
}

func (t *trading) CreateReserve(wallet, prvkey string) (string, string, error) {
	walletAddr, err := address.FromString(wallet)
	if err != nil {
		return "", "", errors.Errorf("invalid wallet address = %s", wallet)
	}

	// create a new conversionRate
	h, err := t.RunAsOwner().Deploy(ConversionRateBinary)
	if err != nil {
		return "", "", errors.Wrap(err, "failed to deploy conversion rate contract")
	}
	receipt, err := t.CheckCallResult(h)
	if err != nil {
		return "", "", errors.Wrap(err, "check failed to deploy conversion rate contract")
	}
	t.conversionRate = receipt.ContractAddress
	convAddr, err := address.FromString(t.conversionRate)
	if err != nil {
		return "", "", errors.Errorf("invalid conversion rate contract address = %s", t.conversionRate)
	}

	// create a new reserve
	h, err = t.Deploy(ReserveBinary)
	if err != nil {
		return "", "", errors.Wrap(err, "failed to deploy reserve contract")
	}
	receipt, err = t.CheckCallResult(h)
	if err != nil {
		return "", "", errors.Wrap(err, "check failed to deploy reserve contract")
	}
	t.reserve = receipt.ContractAddress
	rsvAddr, err := address.FromString(t.reserve)
	if err != nil {
		return "", "", errors.Errorf("invalid reserve contract address = %s", t.reserve)
	}

	// set-up conversionRate contract
	eapAddr, _ := address.FromString(t.eapStorage)
	h, err = t.SetAddress(t.conversionRate).Call("f0bc1c2b", eapAddr.Bytes())
	if err != nil {
		return t.reserve, t.conversionRate, errors.Wrap(err, "call conversion rate contract failed to setEapStorage()")
	}
	time.Sleep(time.Millisecond * 100)

	fpAddr, _ := address.FromString(t.fpManage)
	h1, err := t.Call("9b6d6dfa", fpAddr.Bytes())
	if err != nil {
		return t.reserve, t.conversionRate, errors.Wrap(err, "call conversion rate contract failed to setFPManagement()")
	}
	time.Sleep(time.Millisecond * 100)

	h2, err := t.Call("eb0b304a", []byte{1})
	if err != nil {
		return t.reserve, t.conversionRate, errors.Wrap(err, "call conversion rate contract failed to setDefaultTokenEnable()")
	}
	time.Sleep(time.Millisecond * 100)

	adminAddr, _ := address.FromString(Producer)
	h3, err := t.Call("9870d7fe", adminAddr.Bytes())
	if err != nil {
		return t.reserve, t.conversionRate, errors.Wrap(err, "call conversion rate contract failed to addOperator()")
	}
	time.Sleep(time.Millisecond * 100)

	// set-up reserve contract
	h5, err := t.SetAddress(t.reserve).Call("eef9b113", walletAddr.Bytes())
	if err != nil {
		return t.reserve, t.conversionRate, errors.Wrap(err, "call reserve contract failed to setDefaultTokenWallet()")
	}
	time.Sleep(time.Millisecond * 100)

	h6, err := t.Call("00af0907", convAddr.Bytes())
	if err != nil {
		return t.reserve, t.conversionRate, errors.Wrap(err, "call reserve contract failed to setConversionRatesContract()")
	}
	time.Sleep(time.Millisecond * 100)

	stbAddr, _ := address.FromString(t.stbToken)
	h7, err := t.Call("e674d917", stbAddr.Bytes())
	if err != nil {
		return t.reserve, t.conversionRate, errors.Wrap(err, "call reserve contract failed to setBenchmarkStableToken()")
	}
	time.Sleep(time.Millisecond * 100)

	kybAddr, _ := address.FromString(t.kyber)
	h8, err := t.Call("54a325a6", kybAddr.Bytes())
	if err != nil {
		return t.reserve, t.conversionRate, errors.Wrap(err, "call reserve contract failed to setKyberNetwork()")
	}
	time.Sleep(time.Millisecond * 100)

	h9, err := t.Call("0099d386")
	if err != nil {
		return t.reserve, t.conversionRate, errors.Wrap(err, "call reserve contract failed to enableTrade()")
	}
	time.Sleep(time.Millisecond * 100)

	// token approves reserve
	approve := hash.Hash256{}
	for i := 0; i < len(approve); i++ {
		approve[i] = 255
	}
	h10, err := t.SetExecutor(wallet).
		SetPrvKey(prvkey).
		SetAddress(t.stbToken).Call("095ea7b3", rsvAddr.Bytes(), approve[:])
	if err != nil {
		return t.reserve, t.conversionRate, errors.Wrap(err, "call stable token failed to approve()")
	}
	time.Sleep(time.Millisecond * 100)

	// add reserve to trading contract
	h11, err := t.RunAsOwner().SetAddress(t.kyber).Call("a0d7bb1b", rsvAddr.Bytes(), []byte{1})
	if err != nil {
		return t.reserve, t.conversionRate, errors.Wrap(err, "call trading contract failed to addReserve()")
	}

	if _, err := t.CheckCallResult(h); err != nil {
		return t.reserve, t.conversionRate, errors.Wrap(err, "check conversion rate contract failed to setEapStorage()")
	}
	if _, err := t.CheckCallResult(h1); err != nil {
		return t.reserve, t.conversionRate, errors.Wrap(err, "check conversion rate contract failed to setFPManagement()")
	}
	if _, err := t.CheckCallResult(h2); err != nil {
		return t.reserve, t.conversionRate, errors.Wrap(err, "check conversion rate contract failed to setDefaultTokenEnable()")
	}
	if _, err := t.CheckCallResult(h3); err != nil {
		return t.reserve, t.conversionRate, errors.Wrap(err, "check conversion rate contract failed to addOperator()")
	}
	if _, err := t.CheckCallResult(h5); err != nil {
		return t.reserve, t.conversionRate, errors.Wrap(err, "check reserve contract failed to setDefaultTokenWallet()")
	}
	if _, err := t.CheckCallResult(h6); err != nil {
		return t.reserve, t.conversionRate, errors.Wrap(err, "check reserve contract failed to setConversionRatesContract()")
	}
	if _, err := t.CheckCallResult(h7); err != nil {
		return t.reserve, t.conversionRate, errors.Wrap(err, "check reserve contract failed to setBenchmarkStableToken()")
	}
	if _, err := t.CheckCallResult(h8); err != nil {
		return t.reserve, t.conversionRate, errors.Wrap(err, "check reserve contract failed to setKyberNetwork()")
	}
	if _, err := t.CheckCallResult(h9); err != nil {
		return t.reserve, t.conversionRate, errors.Wrap(err, "check reserve contract failed to enableTrade()")
	}
	if _, err := t.CheckCallResult(h10); err != nil {
		return t.reserve, t.conversionRate, errors.Wrap(err, "check token failed to approve()")
	}
	if _, err := t.CheckCallResult(h11); err != nil {
		return t.reserve, t.conversionRate, errors.Wrap(err, "check trading contract failed to addReserve()")
	}
	return t.reserve, t.conversionRate, nil
}

func (t *trading) SetInterest(conv string, token []string, buy, sell []int64) (string, error) {
	_, err := address.FromString(conv)
	if err != nil {
		return "", errors.Wrapf(err, "invalid conversion rate contract address = %s", conv)
	}

	if len(token) == 1 && token[0] == t.stbToken {
		// this is default interest rate
		h, err := t.RunAsOwner().SetAddress(conv).Call("ecb5cc71", big.NewInt(buy[0]).Bytes(), big.NewInt(sell[0]).Bytes())
		if err != nil {
			return h, errors.Wrap(err, "call conversion rate contract failed to setDefaultBaseInterest()")
		}
		if _, err := t.CheckCallResult(h); err != nil {
			return h, errors.Wrap(err, "check conversion rate contract failed to setDefaultBaseInterest()")
		}
		return h, nil
	}

	var tokenAddr [][]byte
	for _, v := range token {
		addr, err := address.FromString(v)
		if err != nil {
			return "", errors.Errorf("invalid token address = %s", v)
		}
		tokenAddr = append(tokenAddr, addr.Bytes())
	}

	sa := NewSliceAssembler()
	data, err := sa.PackArguments(tokenAddr, buy, sell)
	if err != nil {
		return "", errors.Wrap(err, "failed to pack abi input")
	}
	h, err := t.RunAsOwner().SetAddress(conv).Call("22e39ed3", data)
	if err != nil {
		return h, errors.Wrap(err, "call conversion rate contract failed to setBaseInterest()")
	}

	if _, err := t.CheckCallResult(h); err != nil {
		return h, errors.Wrap(err, "check conversion rate contract failed to setBaseInterest()")
	}
	return h, nil
}

func (t *trading) SetFactor(conv, token string, rating, buy, sell []int64) (string, error) {
	_, err := address.FromString(conv)
	if err != nil {
		return "", errors.Wrapf(err, "invalid conversion rate contract address = %s", conv)
	}

	sa := NewSliceAssembler()
	var method, failed string
	var data []byte
	if token == t.stbToken {
		// this is default credit rating factor
		data, err = sa.PackArguments(rating, buy, sell)
		if err != nil {
			return "", errors.Wrap(err, "failed to pack abi input")
		}
		method = "b6effa16"
		failed = "conversion rate contract failed to setDefaultCreditRatingFactor()"
	} else {
		tokenAddr, err := address.FromString(token)
		if err != nil {
			return "", errors.Wrapf(err, "invalid token address = %s", token)
		}
		data, err = sa.PackArguments(tokenAddr.Bytes(), rating, buy, sell)
		if err != nil {
			return "", errors.Wrap(err, "failed to pack abi input")
		}
		method = "44b4c8fd"
		failed = "conversion rate contract failed to setCreditRatingFactor()"
	}

	h, err := t.RunAsOwner().SetAddress(conv).Call(method, data)
	if err != nil {
		return h, errors.Wrap(err, fmt.Sprintf("call %s", failed))
	}

	if _, err := t.CheckCallResult(h); err != nil {
		return h, errors.Wrap(err, fmt.Sprintf("check %s", failed))
	}
	return h, nil
}

func (t *trading) Start() error {
	kybAddr, err := address.FromString(t.kyber)
	if err != nil {
		return errors.Errorf("invalid trading contract address = %s", t.kyber)
	}
	kybProxyAddr, err := address.FromString(t.kyberProxy)
	if err != nil {
		return errors.Errorf("invalid trading proxy contract address = %s", t.kyberProxy)
	}
	rateAddr, err := address.FromString(t.expectedRate)
	if err != nil {
		return errors.Errorf("invalid ExpectedRate contract address = %s", t.expectedRate)
	}
	crAddr, err := address.FromString(t.creditRating)
	if err != nil {
		return errors.Errorf("invalid CreditRating contract address = %s", t.creditRating)
	}
	_, err = address.FromString(t.fpManage)
	if err != nil {
		return errors.Errorf("invalid fp token management contract address = %s", t.fpManage)
	}

	h, err := t.RunAsOwner().SetAddress(t.kyberProxy).Call("abd188a8", kybAddr.Bytes())
	if err != nil {
		return errors.Wrap(err, "call trading proxy contract failed to setKyberNetworkContract()")
	}
	time.Sleep(time.Millisecond * 100)

	h1, err := t.Call("71616bb8", crAddr.Bytes())
	if err != nil {
		return errors.Wrap(err, "call trading proxy contract failed to setUserCreditRating()")
	}

	time.Sleep(time.Millisecond * 100)

	h2, err := t.SetAddress(t.kyber).Call("c6c3f3f9", kybProxyAddr.Bytes())
	if err != nil {
		return errors.Wrap(err, "call trading contract failed to setKyberProxy()")
	}
	time.Sleep(time.Millisecond * 100)

	h3, err := t.Call("fc2a5f45", rateAddr.Bytes())
	if err != nil {
		return errors.Wrap(err, "call trading contract failed to setExpectedRateContract()")
	}
	time.Sleep(time.Millisecond * 100)

	stbAddr, _ := address.FromString(t.stbToken)
	h4, err := t.Call("e674d917", stbAddr.Bytes())
	if err != nil {
		return errors.Wrap(err, "call trading contract failed to setBenchmarkStableToken()")
	}
	time.Sleep(time.Millisecond * 100)

	h5, err := t.Call("7726bed3", []byte{1})
	if err != nil {
		return errors.Wrap(err, "call trading contract failed to setEnable()")
	}

	if _, err := t.CheckCallResult(h); err != nil {
		return errors.Wrap(err, "check trading proxy contract failed to setKyberNetworkContract()")
	}
	if _, err := t.CheckCallResult(h1); err != nil {
		return errors.Wrap(err, "check trading proxy contract failed to setUserCreditRating()")
	}
	if _, err := t.CheckCallResult(h2); err != nil {
		return errors.Wrap(err, "trading contract failed to setKyberProxy()")
	}
	if _, err := t.CheckCallResult(h3); err != nil {
		return errors.Wrap(err, "check trading contract failed to setExpectedRateContract()")
	}
	if _, err := t.CheckCallResult(h4); err != nil {
		return errors.Wrap(err, "check trading contract failed to setBenchmarkStableToken()")
	}
	if _, err := t.CheckCallResult(h5); err != nil {
		return errors.Wrap(err, "check trading contract failed to setEnable()")
	}
	return nil
}

func (t *trading) SetAccountCreditRating(user string, rating int64) (string, error) {
	var method string
	var addr []byte
	if user == StableTokenID {
		// "1f45051c": "setDefaultCR(uint256)"
		method = "1f45051c"
		addr = nil
	} else {
		a, err := address.FromString(user)
		if err != nil {
			return "", errors.Errorf("invalid account address = %s", user)
		}
		// "8b687a74": "setUserCR(address,uint256)"
		method = "8b687a74"
		addr = a.Bytes()
	}
	h, err := t.RunAsOwner().
		SetAddress(t.creditRating).
		Call(method, addr, big.NewInt(rating).Bytes())
	if err != nil {
		return h, errors.Wrapf(err, "call failed to set credit rating for account %s", user)
	}

	if _, err := t.CheckCallResult(h); err != nil {
		return h, errors.Wrapf(err, "check failed to set credit rating for account %s", user)
	}
	return h, nil
}

func (t *trading) GetAccountCreditRating(user string) (string, error) {
	// "887712c7": "userCR(address)"
	return t.ReadAndParseToDecimal(t.creditRating, "887712c7", user)
}

func (t *trading) QuoteRate(srcToken, dstToken string, amount, rating int64) (string, error) {
	srcAddr, err := address.FromString(srcToken)
	if err != nil {
		return "", errors.Errorf("invalid asset address = %s", srcToken)
	}
	dstAddr, err := address.FromString(dstToken)
	if err != nil {
		return "", errors.Errorf("invalid asset address = %s", dstToken)
	}

	h, err := t.RunAsOwner().
		SetAddress(t.kyber).
		Call("b2931f16", srcAddr.Bytes(), dstAddr.Bytes(), big.NewInt(amount).Bytes(), big.NewInt(rating).Bytes())
	if err != nil {
		return h, errors.Wrapf(err, "call failed to get expected rate for token %s:%s", srcToken, dstToken)
	}

	// TODO (dustinxie): fix the rate checking
	_, err = t.CheckCallResult(h)
	if err != nil {
		return h, errors.Wrapf(err, "check failed to get expected rate for token %s:%s", srcToken, dstToken)
	}
	return "", nil
}

func (t *trading) Trade(trader, prvkey, srcToken, dstToken string, amount, minConvRate int64) (string, error) {
	srcAddr, err := address.FromString(srcToken)
	if err != nil {
		return "", errors.Errorf("invalid asset address = %s", srcToken)
	}
	dstAddr, err := address.FromString(dstToken)
	if err != nil {
		return "", errors.Errorf("invalid asset address = %s", dstToken)
	}
	kybProxyAddr, _ := address.FromString(t.kyberProxy)

	// approve proxy to transfer token
	h, err := t.SetAddress(srcToken).
		SetExecutor(trader).
		SetPrvKey(prvkey).
		Call("095ea7b3", kybProxyAddr.Bytes(), big.NewInt(amount).Bytes())
	if err != nil {
		return h, errors.Wrapf(err, "call token %s failed to approve()", srcToken)
	}
	time.Sleep(time.Millisecond * 100)

	h1, err := t.SetAddress(t.kyberProxy).
		Call("7409e2eb", srcAddr.Bytes(), big.NewInt(amount).Bytes(), dstAddr.Bytes(), big.NewInt(minConvRate).Bytes())
	if err != nil {
		return h1, errors.Wrapf(err, "call failed to trade token %s:%s", srcToken, dstToken)
	}

	if _, err := t.CheckCallResult(h); err != nil {
		return h, errors.Wrapf(err, "check token %s failed to approve()", srcToken)
	}
	if _, err := t.CheckCallResult(h1); err != nil {
		return h1, errors.Wrapf(err, "check failed to trade token %s:%s", srcToken, dstToken)
	}
	return h1, nil
}

func (t *trading) SetTrading(tr string) Trading {
	t.kyber = tr
	return t
}

func (t *trading) SetTradingProxy(proxy string) Trading {
	t.kyberProxy = proxy
	return t
}

func (t *trading) SetCreditRating(cr string) Trading {
	t.creditRating = cr
	return t
}

func (t *trading) SetExpectedRate(rate string) Trading {
	t.expectedRate = rate
	return t
}

func (t *trading) SetEapStorage(eap string) Trading {
	t.eapStorage = eap
	return t
}

func (t *trading) SetFpManage(fp string) Trading {
	t.fpManage = fp
	return t
}

func (t *trading) SetStableToken(stb string) Trading {
	t.stbToken = stb
	return t
}
